package com.simple.cloud.core.utils;


import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import org.bouncycastle.crypto.generators.OpenBSDBCrypt;

import java.security.SecureRandom;

/**
 * 加密相关
 */
public class CryptUtil {

    /**
     * @param plain 明文
     * @param salt  盐
     * @param cost  哈希值成本因子，决定哈希函数的计算复杂度
     * @return 密文
     */
    public static String hashPwd(String plain, String salt, int cost) {
        // 生成一个随机的盐值
        SecureRandom random = new SecureRandom();
        byte[] saltBytes = new byte[16];
        if (StrUtil.isNotBlank(salt) && salt.length() < 16) {
            saltBytes = String.format("%-" + 16 + "s", salt).replace(' ', '0').getBytes();
        }
        random.nextBytes(saltBytes);
        // 使用盐值生成哈希密码
        return OpenBSDBCrypt.generate(plain.toCharArray(), saltBytes, cost);
    }

    public static String hashPwd(String plain, String salt) {
        return hashPwd(plain, salt, 10);
    }

    public static String hashPwd(String plain) {
        return hashPwd(plain, RandomUtil.randomString(16), 10);
    }

    /**
     * @param plain  明文
     * @param cipher 密文
     * @return boolean
     */
    public static boolean checkPwd(String plain, String cipher) {
        // 验证输入的明文密码是否与哈希密码匹配
        return OpenBSDBCrypt.checkPassword(cipher, plain.toCharArray());
    }

}
